#include "knl_timer.h"
using namespace boost::posix_time;

namespace knl
{
	knl_timer::knl_timer(void)
	{
		*this = microsec_localTime();
	}

	knl_timer::knl_timer( knl_timer& _time )
	{
		*this = _time;
	}

	knl_timer::knl_timer( boost::posix_time::ptime& _time )
	{
		_timer = _time;
	}

	knl_timer::~knl_timer(void)
	{
	}

	bool knl_timer::operator==( knl_timer& _time ) const
	{
		return (_timer == _time.timer());
	}

	bool knl_timer::operator!=( knl_timer& _time ) const
	{
		return (_timer != _time.timer());
	}

	knl_timer& knl_timer::operator=( knl_timer& _time )
	{
		_timer = _time.timer();
		return *this;
	}

	std::string knl_timer::toString( TIME_ENUM _type )
	{
		switch(_type)
		{
		case full_time_string:
			return to_simple_string(_timer);
		case iso_ext_time_string:
			return to_iso_extended_string(_timer);
		case iso_time_string:
			return to_iso_string(_timer);
		default:
			return to_simple_string(_timer);
		}
	}

	knl_timer& knl_timer::from_string( char* lpszFormat )
	{
		return knl_timer(from_string(lpszFormat));
	}

	knl_timer& knl_timer::from_iso_string( char* lpszFormat )
	{
		return knl_timer(from_iso_string(lpszFormat));
	}

	knlInt64 knl_timer::getTickCount()
	{
#ifndef WIN32
		struct timeval tvpre;
		gettimeofday(&tvpre, NULL);

		return (tvpre.tv_sec*1000)+(tvpre.tv_usec/1000);
#else
		return timeGetTime();
#endif
	}

	knl_timer& knl_timer::second_localTime()
	{
		return knl_timer(second_clock::local_time());
	}

	knl_timer& knl_timer::microsec_localTime()
	{
		return knl_timer(microsec_clock::local_time());
	}

	std::string knl_timer::toDayString()
	{
		return to_iso_string(_timer.date());
	}

}